home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Graphics Programming (2nd Edition) / Visual Basic Graphics Programming 2nd Edition.iso / Src / Ch15 / Trans.cls < prev    next >
Text File  |  1999-06-25  |  6KB  |  204 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "Transformed3d"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = False
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Option Explicit
  15.  
  16. Private NumCurvePts As Integer
  17. Private CurvePoints() As Point3D
  18.  
  19. Private NumTrans As Integer
  20. Private trans() As Transformation
  21.  
  22. Private solid As Solid3d   ' The display solid.
  23. Public Property Get HideSurfaces() As Boolean
  24.     If Not (solid Is Nothing) Then HideSurfaces = solid.HideSurfaces
  25. End Property
  26.  
  27. Public Property Let HideSurfaces(ByVal new_value As Boolean)
  28.     If Not (solid Is Nothing) Then solid.HideSurfaces = new_value
  29. End Property
  30.  
  31. ' Create the display solid by applying the
  32. ' series of transformations in array M().
  33. Public Sub Transform(Optional cap_ends As Variant)
  34. Dim face As Face3d
  35. Dim i As Integer
  36. Dim j As Integer
  37. Dim x0 As Single
  38. Dim y0 As Single
  39. Dim z0 As Single
  40. Dim x1 As Single
  41. Dim y1 As Single
  42. Dim z1 As Single
  43. Dim x2 As Single
  44. Dim y2 As Single
  45. Dim z2 As Single
  46. Dim x3 As Single
  47. Dim y3 As Single
  48. Dim z3 As Single
  49.  
  50.     If IsMissing(cap_ends) Then cap_ends = True
  51.  
  52.     Set solid = New Solid3d
  53.  
  54.     ' Add the base curve to solid assuming the
  55.     ' curve is stored oriented towards the
  56.     ' transformations.
  57.     If cap_ends Then
  58.         Set face = New Face3d
  59.         solid.Faces.Add face
  60.         For i = NumCurvePts - 1 To 1 Step -1
  61.             face.AddPoints _
  62.                 CurvePoints(i).coord(1), _
  63.                 CurvePoints(i).coord(2), _
  64.                 CurvePoints(i).coord(3)
  65.         Next i
  66.     End If
  67.  
  68.     ' Start with the transformed coordinates
  69.     ' the same as the original coordinates.
  70.     For i = 1 To NumCurvePts
  71.         CurvePoints(i).trans(1) = CurvePoints(i).coord(1)
  72.         CurvePoints(i).trans(2) = CurvePoints(i).coord(2)
  73.         CurvePoints(i).trans(3) = CurvePoints(i).coord(3)
  74.     Next i
  75.  
  76.     ' Create the transformed copies of the curve.
  77.     For i = 1 To NumTrans
  78.         x0 = CurvePoints(1).trans(1)
  79.         y0 = CurvePoints(1).trans(2)
  80.         z0 = CurvePoints(1).trans(3)
  81.         m3ApplyFull _
  82.             CurvePoints(1).coord, trans(i).M, _
  83.             CurvePoints(1).trans
  84.         x1 = CurvePoints(1).trans(1)
  85.         y1 = CurvePoints(1).trans(2)
  86.         z1 = CurvePoints(1).trans(3)
  87.  
  88.         For j = 2 To NumCurvePts
  89.             x2 = CurvePoints(j).trans(1)
  90.             y2 = CurvePoints(j).trans(2)
  91.             z2 = CurvePoints(j).trans(3)
  92.             m3ApplyFull _
  93.                 CurvePoints(j).coord, trans(i).M, _
  94.                 CurvePoints(j).trans
  95.             x3 = CurvePoints(j).trans(1)
  96.             y3 = CurvePoints(j).trans(2)
  97.             z3 = CurvePoints(j).trans(3)
  98.  
  99.             solid.AddFace _
  100.                 x0, y0, z0, _
  101.                 x2, y2, z2, _
  102.                 x1, y1, z1
  103.             
  104.             solid.AddFace _
  105.                 x2, y2, z2, _
  106.                 x3, y3, z3, _
  107.                 x1, y1, z1
  108.             x0 = x2
  109.             y0 = y2
  110.             z0 = z2
  111.             x1 = x3
  112.             y1 = y3
  113.             z1 = z3
  114.         Next j
  115.     Next i
  116.  
  117.     ' Add the final curve to solid assuming
  118.     ' the curve is stored oriented towards the
  119.     ' transformations.
  120.     If cap_ends Then
  121.         Set face = New Face3d
  122.         solid.Faces.Add face
  123.         For i = 2 To NumCurvePts
  124.             face.AddPoints _
  125.                 CurvePoints(i).trans(1), _
  126.                 CurvePoints(i).trans(2), _
  127.                 CurvePoints(i).trans(3)
  128.         Next i
  129.     End If
  130. End Sub
  131.  
  132. ' Clip the display solid.
  133. Public Sub ClipEye(ByVal r As Single)
  134.     If Not solid Is Nothing Then solid.ClipEye r
  135. End Sub
  136. ' Add a point to the curve.
  137. Public Sub AddCurvePoint(X As Single, Y As Single, z As Single)
  138.     NumCurvePts = NumCurvePts + 1
  139.     ReDim Preserve CurvePoints(1 To NumCurvePts)
  140.     CurvePoints(NumCurvePts).coord(1) = X
  141.     CurvePoints(NumCurvePts).coord(2) = Y
  142.     CurvePoints(NumCurvePts).coord(3) = z
  143.     CurvePoints(NumCurvePts).coord(4) = 1
  144. End Sub
  145.  
  146.  
  147.  
  148.  
  149. ' Set a transformation.
  150. Public Sub SetTransformation(M() As Single)
  151.     NumTrans = NumTrans + 1
  152.     ReDim Preserve trans(1 To NumTrans)
  153.     m3MatCopy trans(NumTrans).M, M
  154. End Sub
  155.  
  156. ' Apply a transformation matrix which may not
  157. ' contain 0, 0, 0, 1 in the last column to the
  158. ' object.
  159. Public Sub ApplyFull(M() As Single)
  160. Dim i As Integer
  161.  
  162.     ' Transform the curve.
  163.     For i = 1 To NumCurvePts
  164.         m3ApplyFull CurvePoints(i).coord, M, _
  165.                     CurvePoints(i).trans
  166.     Next i
  167.     
  168.     ' Transform the display solid if it exists.
  169.     If Not solid Is Nothing Then solid.ApplyFull M
  170. End Sub
  171.  
  172. ' Apply a transformation matrix to the object.
  173. Public Sub Apply(M() As Single)
  174. Dim i As Integer
  175.  
  176.     ' Transform the curve.
  177.     For i = 1 To NumCurvePts
  178.         m3Apply CurvePoints(i).coord, M, _
  179.                 CurvePoints(i).trans
  180.     Next i
  181.     
  182.     ' Transform the display solid if it exists.
  183.     If Not solid Is Nothing Then solid.Apply M
  184. End Sub
  185.  
  186.  
  187. ' Draw the extrusion on a Form, Printer, or
  188. ' PictureBox.
  189. Public Sub Draw(ByVal pic As PictureBox, Optional r As Variant)
  190.     If Not solid Is Nothing Then _
  191.         solid.Draw pic, r
  192. End Sub
  193.  
  194.  
  195. ' Perform backface removal on the display solid.
  196. Public Sub Cull(ByVal X As Single, ByVal Y As Single, ByVal z As Single)
  197.     If Not solid Is Nothing Then solid.Cull X, Y, z
  198. End Sub
  199.  
  200. ' Set or clear the Culled property for the solid.
  201. Property Let Culled(value As Boolean)
  202.     If Not solid Is Nothing Then solid.Culled = value
  203. End Property
  204.